SQLAlchemy 是为 Python 编程语言提供的开源 SQL 工具包及对象关系映射器,在关系型数据管理中有广泛应用。该文是包括了一些使用过程中的一些总结经验。包括了以下相关内容
- 添加日期自动更新的 triger
- Decimal 控制数据不一致
1. 日期自动更新
在创建数据库时,某些事务发生更新需要同步更新时间戳。在创建 Table 时,SQLAlchemy 默认是没有让日期发生自动更新。因此在使用更新时需要调整参数,可以使用 sqlalchemy 中的 func 模块中日期处理方法。具体的示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import sqlalchemy import datetime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import func
Base = declarative_base()
class TempItem(Base): """外源信息临时表 外源信息临时表,用于存储需要影视信息种子源。表名是 `series_temp`,schema 信息可以通过`douban_series.sql` 文件中确认 """ __tablename__ = "series_temp" id = sqlalchemy.Column(sqlalchemy.BigInteger, primary_key=True, autoincrement=True) series_id = sqlalchemy.Column(sqlalchemy.VARCHAR(length=20, convert_unicode=True), nullable=False, unique=True) title = sqlalchemy.Column(sqlalchemy.VARCHAR(150, convert_unicode=True, collation="utf8mb4"), nullable=False) main_tag = sqlalchemy.Column(sqlalchemy.VARCHAR(10, convert_unicode=True, collation="utf8mb4"), nullable=True) status = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False, default=False) create_time = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=func.now()) update_time = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=func.now(), onupdate=func.now()) def __repr__(self): format = "<Data Model Object: %s at %s>" return format % (self.__class__.__tablename__, hex(id(self)))
def __str__(self): string = f"Item data:\n\t ID: {self.id} Series_ID: {self.series_id}" + \ f" Title: {self.title} Status: {self.status}" return string
|
另一种方法是直接将 使用 Column
中 default 参数是调整为 default=datetime.datetime.now
,注意使用传入的是一个方法,而非实际值(未加括号)
2. 解决数据写入读取一致
在写入数据时可能出现 123.456789,但存储到数据库以及读取数据时变为 123.457。该问题主要时因为数据精度的问题,常规来说数据类型可以使用 Double 替换 Float 方式解决,但也会带来数据占据位数增加的问题。推荐使用定点类型(DECIMAL),DECIMAL 有两个参数,第一个参数用于指定一共多少位数,第二个参数用于指定小数点后最多多少位数。DECIMAL(4,2)
表示一共存储4位数字,小数点后最多有两位